import Designer from '@/index';
import { disableColor } from '@/utils';

// 默认样式配置
export const defaultStyle = {
  strokeStyle: '#CBD5E1', // 描边颜色
  strokeDash: [], // 描述虚线模式的线和间隙的交替长度
  fillStyle: 'white', // 填充颜色
  pinColor: '#9CA3AF', // 引脚颜色
  nameColor: '#111827', // 引脚名颜色
  innerStrokeStyle: '#F1F5F9', // 内边框描边颜色
};

// 锁定状态样式配置
export const lockedStyle = {
  strokeStyle: '#D1D5DB', // 描边颜色
  fillStyle: '#F1F5F9', // 填充颜色
  pinColor: '#D1D5DB', // 引脚颜色
  nameColor: '#4B5563', // 引脚名颜色
  innerStrokeStyle: '#F1F5F9', // 内边框描边颜色
};

// 空锚点状态样式配置
export const emptyAnchorsStyle = {
  strokeStyle: '#9CA3AF', // 描边颜色
  strokeDash: [4], // 描述虚线模式的线和间隙的交替长度
  fillStyle: '#EFF6FF', // 填充颜色
  pinColor: '#9CA3AF', // 引脚颜色
  nameColor: '#111827', // 引脚名颜色（占位文本颜色）
  innerStrokeStyle: '#EFF6FF', // 内边框描边颜色
};

// 获取最终计算后的样式配置
export const computedStyle = (
  config,
  { selected = false, nodeHovering = false, anchorHovering = false, anchorEffecting = false },
) => {
  const style = {
    ...defaultStyle,
    ...config,
    // 锁定状态
    ...(config.locked && lockedStyle),
    // 空锚点状态
    ...(config.emptyAnchors && emptyAnchorsStyle),
  };
  // 节点 hover 状态
  if (nodeHovering) {
    style.strokeStyle = Designer.theme;
  }
  // 锚点 hover 状态
  if (anchorHovering) {
    style.pinColor = Designer.theme;
    style.nameColor = Designer.theme;
  }
  // 锚点 受影响 状态
  if (anchorEffecting) {
    style.pinColor = Designer.theme;
  }
  // 节点选中状态
  if (selected) {
    style.strokeStyle = Designer.theme;
    style.pinColor = Designer.theme;
  }
  return style;
};

// 获取最终计算后的逻辑块 name 样式配置
export const computedNameStyle = (config) => {
  const style = {
    background: Designer.theme, // 容器填充颜色
    color: 'white', // 文字颜色
    ...config.nameStyle,
  };
  // 未设置描边颜色 使用容器填充颜色作为 容器描边颜色
  if (!style.border) style.border = style.background;
  // 节点锁定状态
  if (config.locked) {
    style.background = style.disableBackground ?? disableColor(style.background, 0.5);
    style.border = style.disableBorder ?? style.disableBackground ?? disableColor(style.border, 0.5);
    style.color = style.disableColor ?? disableColor(style.color, 0.5);
  }
  return style;
};
